<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>面向对象</title>
</head>
<body>
	<script>
		<!-- 对象直接量 -->
		// var book = {
		// 	"main title" : "javascript",/*属性名中有空格，必须用字符串表示*/
		// 	"sub-title" : "the definitive guide",/*属性名中有连字符，必须用字符串表示*/
		// 	"for" : "all audiences",/*for是保留字，因此必须用引号*/
		// 	author:{
		// 		firstname:"dave",
		// 		lastname:"jee"
		// 	}
		// }
		// console.log(book);
		// console.log(book.author);
		// console.log(book.for);
		// console.log("author" in book);
		// console.log(book.hasOwnProperty("author"));







		/*关键字new后跟随一个函数调用。这里的函数称作构造函数*/
		// var o = new Object();/*创建一个空对象，和{}一样*/
		// var a = new Array();/*创建一个空数组，和[]一样*/
		// var d = new Date();/*创建一个表示当前时间的Date对象*/
		// var r = new RegExp("js");/*创建一个可以进行模式匹配的RegExp对象*/

		// var p = {
		// 	x:1.0,
		// 	y:1.0,

		// 	get r(){
		// 		return Math.sqrt(this.x*this.x+this.y*this.y);
		// 	},
		// 	set r(newvalue) {
		// 		var oldvalue = Math.sqrt(this.x*this.x+this.y*this.y);
		// 		var ratio = newvalue/oldvalue;
		// 		this.x*=ratio;
		// 		this.y*=ratio;
		// 	},
		// 	get theta(){
		// 		return Math.atan2(this.y,this.x);
		// 	}
		// }
		// console.log(p.r);
		// console.log(p);
		// console.log(p.x);
		// console.log(p.y);
		// console.log(p.theta);






		/*要想设置属性的特性，或者让新建属性具有某种特性，则需要调用Object.definePeoperty(),传入要修改的对象、要创建或修改的名称以及属性描述符对象*/

		var o = {};//创建一个空对象
		//添加一个不可枚举的数据属性x，并赋值为1
		Object.defineProperty(o,"x",{
			value:1,
			writable:true,
			enumerable:false,
			configurable:true
		});
		//属性是存在的，但不可枚举
		console.log(o.x);
		console.log(Object.keys(o));

/*p.isPrototypeOf(o) 检测p是否是o的原型*/
		var p = {x:1};//定义一个原型对象
		var o = Object.create(p);//使用这个原型对象创建一个对象
		console.log(p.isPrototypeOf(o));
		console.log(Object.prototype.isPrototypeOf(o));

		/*序列化对象*/
		var n = {
			x:1,
			y:{
				z:[false,null,""]
			}
		};
		s = JSON.stringify(n);
		p = JSON.parse(s);
		console.log(n);
		console.log(s);
		console.log(p);

	</script>
</body>
</html>